package com.itheima.web;

import com.itheima.bean.User;
import com.itheima.common.R;

import com.itheima.sevrice.UserService;
import com.itheima.utils.ValidateCodeUtils;
import org.omg.CORBA.TIMEOUT;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.security.Key;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
public class UserController {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Autowired
    private UserService userService;

    /**
     * 生成验证码
     * @param phone
     * @param
     * @return
     */
    @GetMapping("/user/sendCode/{phone}")
    public R sendCode(@PathVariable String phone) {
        //使用工具 生成验证码
        String code = ValidateCodeUtils.generateValidateCode4String(4);

        //2.调用短信的API 给手机号 发短信，【实际工作中流程】
        //SMSUtils.sendMessage("签名","模板代号","phone","变量参数code");

        //3.联系替代做法。把短信验证码和手机号直接返回给页面，方便前端 校验手机号对应相应的验证码
        // 需要把手机号和验证码 保持到网页的session 作用域
        //session.setAttribute(phone,code);

        //redis 改造后 保存验证码 设置验证码5分钟过期
        String key="VALIDATE_CODE"+phone;
        redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES);

        return R.success(code);
    }

    /**
     * 登陆验证
     * @param map
     * @param session
     * @return
     */
    @PostMapping("/user/login")
    public R login(@RequestBody Map<String,String> map, HttpSession session){
        //1.获取手机号和验证码
        String phone = map.get("phone");
        String code = map.get("code");

        //2.获取之前session 保存的手机号和验证码 进行校验 ,通过 key：phone 获取value ： code
        //String sessionCode = (String) session.getAttribute(phone);

        //redis 改造验证码 第二步：获取redis中的验证码
        String key="VALIDATE_CODE"+phone;
        String sessionCode = redisTemplate.opsForValue().get(key);

        //3.比较验证码
        if (!sessionCode.equalsIgnoreCase(code)){
            //如果不成功，直接返回，验证码错误，登陆失败
            return R.error("验证码错误，请重新登陆！");
        }
        //TODO:: 1.登录成功之后，过滤器处于使用状态，页面会重定向到后台的登陆页面，这是因为在过滤器里面判断是否有登录
        //是判断后台员工的登陆。

        //TODO::2.判断验证码正确之后，就要考虑把这个用户的数据保存起来，保存到【数据库User】 工作
        //      2.1先根据手机号去查询数据库，看看这个用户以前是不是有登陆过，有，就要把他的信息查询出来，存储到session 作用域
        //         以便知道是谁点的订单
        //      2.2 如果数据库里面没有这个用户数据，那么表明这个用户是第一次来登陆点餐的，此时就要执行添加的操作，
        //      把这个用户的信息保存到数据库里面。

        redisTemplate.delete(key);//验证码已经校验过了，则直接删除验证码
       User user = userService.findByPhone(phone);

        if (user !=null){
            //表明是老客户，已经登陆过了
            //把登陆的信息保存到session 作用域
            session.setAttribute("user",user);

        }else{
            //表明是新顾客 ，把顾客信息 保存到数据库中
            User userNew = new User();
            userNew.setPhone(phone);
            userNew.setName("瑞吉-"+phone);
            //存储到数据库
            int row = userService.addUser(userNew);
            if (row>0){
                //登录成功
                //把登陆的信息保存到session 作用域
                session.setAttribute("user",userNew);
                return R.success("登录成功！");
            }else {
                //登陆失败
                return R.error("登陆失败");
            }
        }
        return R.success("登录成功！");

    }


}
